package com.taoyun.web.controller;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.taoyun.pojo.entity.User;
import com.taoyun.service.IUserService;
import com.taoyun.utils.MD5;
import com.taoyun.utils.RandomCode;
import com.taoyun.utils.Response;
import com.taoyun.utils.UserUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

import javax.servlet.http.HttpServletRequest;
import java.util.Date;
import java.util.UUID;

@RestController
public class ResetPasswordController {

    @Autowired
    private IUserService userService;

    // 注入JavaMailSender实例
    @Autowired
    private JavaMailSender javaMailSender;

    @Value("${spring.mail.username}")
    private String form;

    // 发送邮件的时间
    private Date sendTime;

    //注入连接池对象
    @Autowired
    private JedisPool jedisPool;

    /**
     * 发送邮箱验证码
     * @param userNumber 用户账号
     * @param email 邮箱
     * @return
     *
     * 方法：post
     *
     * path: http://localhost:8080/taoyun/v1/getVerCode
     *
     *
     *请求成功：
     * {
     *     "code": "200",
     *     "msg": "邮件发送成功！",
     *     "data": "994be3da80c6493384ee235ee8f92b1d" //对应验证码的令牌
     * }
     */
    @PostMapping("taoyun/v1/getVerCode")
    public Response getVerCodeByEmail(@RequestParam(value="userNumber") String userNumber,
                                      @RequestParam(value="email") String email){
        //判断账号是否为空
        if(userNumber==null || "".equals(userNumber)){
            return Response.error("账号不能为空！");
        }
        // 判断邮箱是否为空
        if(email == null || "".equals(email)){
           return Response.error("邮箱不能为空！");
        }
        //通过邮箱获取该用户
        User user = userService.searchByEmailAndUserNumber(userNumber,email);
        // 判断数据库中是否存在该邮箱
        if(user == null){
           return Response.error("账号或者邮箱输入错误！");
        }
        else{
            // 生成一个标识验证码值的key
            String tokenCode = UUID.randomUUID().toString().replace("-","").toLowerCase();
            // 生成6位数的验证码
            String code = RandomCode.generateCode();
            //System.out.println("生成的验证码是：" + code);
            // 注： ObjectMapper是Jackson库中主要用于读取和写入Json数据的类
            ObjectMapper mapper = new ObjectMapper();
            try {
                // 真正的把code转换成Json数据响应到页面
                String jsonRst = code;
                //连接池对象
                Jedis jedis = jedisPool.getResource();
                //写入token和对应的用户对象
                jedis.set(tokenCode, jsonRst);
                //设置键值对的有效时间5分钟
                jedis.expire(tokenCode,300);
                //关闭
                jedis.close();
                //发邮件
                SimpleMailMessage message = new SimpleMailMessage();
                //邮箱主题
                message.setSubject("验证码");
                //获取当前时间
                sendTime = new Date();
                //System.out.println("sendTime:"+sendTime);
                //设置邮件正文
                message.setText("尊敬的用户,您好:\n"
                        + "\n本次请求的邮件验证码为:" + code + ",本验证码5分钟内有效，请及时输入。（请勿泄露此验证码）\n"
                        + "\n如非本人操作，请忽略该邮件。\n(这是一封自动发送的邮件，请不要直接回复）");

                message.setFrom(form); //发送者
                message.setTo(email); //收件人
                javaMailSender.send(message);
                return Response.success("邮件发送成功！",tokenCode);
            }
            catch (Exception e) {
                e.printStackTrace();
            }
        }

        return null;

    }


    /**
     * 忘记密码功能
     * @param userNumber 账号（员工号）
     * @param email 邮箱
     * @param verCode 验证码
     * @param newPassword 新密码
     * @param confirmPassword 确认密码
     * @return
     *
     * method: post
     *
     * path: http://localhost:8080/taoyun/v1/retrievePassword
     *
     *请求成功：
     *
     * {
     *     "code": "200",
     *     "msg": "重置密码成功！",
     *     "data": null
     * }
     *
     */
    @PostMapping("taoyun/v1/retrievePassword")
    public Response retrievePassword(@RequestParam(value = "userNumber") String userNumber,
                                     @RequestParam(value = "email") String email,
                                     @RequestParam(value = "verCode") String verCode,
                                     @RequestParam(value = "newPassword") String newPassword,
                                     @RequestParam(value = "confirmPassword") String confirmPassword,
                                     HttpServletRequest request) {
        //判断输入框是否为空
        if (userNumber == null || "".equals(userNumber)) {
            return Response.error("账号不能为空！");
        }
        if (email == null || "".equals(email)) {
            return Response.error("邮箱不能为空！");
        }
        if (verCode == null || "".equals(verCode)) {
            return Response.error("验证码不能为空！");
        }
        if (newPassword == null || "".equals(newPassword)) {
            return Response.error("密码不能为空！");
        }
        if (confirmPassword == null || "".equals(confirmPassword)) {
            return Response.error("确认密码不能为空！");
        }
        //判断密码和确认密码是否一致
        if (!newPassword.equals(confirmPassword)) {
            return Response.error("两次密码不一致！");
        }
        //获取令牌
        String tokenCode = request.getHeader("tokenCode");
        String tokenLogin = request.getHeader("tokenLogin");
        Jedis jedis = jedisPool.getResource();
        //获取Redis中存储的验证码
        String tokenValue = jedis.get(tokenCode);
        System.out.println("tokenValue:" + tokenValue);
        System.out.println(verCode);
        //判断提交的验证码和Redis中的验证码是否一致
        if (verCode.equals(tokenValue)) {
            //获取当前时间
            Date now = new Date();
            //判断验证码是否已经过期(单位为秒）
            int second = RandomCode.getTimeDiff(sendTime, now);
            //5分钟以内，即不过期
            if (second <= 300) {
                //修改密码
                boolean flag = userService.resetPassword(userNumber, email, MD5.stringMD5(newPassword));
                //判断是否是登录状态
                //如果登录的令牌不为空
                if (flag == true && (tokenLogin != null && !"".equals(tokenLogin))) {
                    //删除token
                    jedis.del(tokenCode);
                    jedis.del(tokenLogin);
                    return Response.success("修改密码成功！", null);
                } else if (flag == true && (tokenLogin == null || "".equals(tokenLogin))) {
                    //登录令牌为空
                    jedis.del(tokenCode);
                    return Response.success("重置密码成功！", null);
                } else {
                    return Response.error("重置或修改密码失败！");
                }

            } else {
                return Response.error("验证码已经失效，请重新获取！");
            }

        } else {
            return Response.error("验证码不正确！");
        }
    }


    /**
     * 登录后修改密码:这里前端要输入账号（固定死）、原来密码、新密码、确认新密码
     * 用户修改密码时先会用账号和密码与token中的匹配，匹配成功后才会把新密码提交
     * 到后面的操作，否则新密码不生效
     * @param userNumber 账号
     * @param password 原密码
     * @param newPassword 新密码
     * @param confirmPassword 再次确认新密码
     * @return
     *
     * method: post
     *
     * path:http://localhost:8080/taoyun/v1/modifyPassword
     *
     *请求成功：
     * {
     *     "code": "200",
     *     "msg": "登录后 ----- 修改密码成功！",
     *     "data": null
     * }
     *
     */

    @PostMapping("taoyun/v1/modifyPassword")
    public Response modifyPassword(@RequestParam(value="userNumber") String userNumber,@RequestParam(value="password") String password,@RequestParam(value="newPassword") String newPassword,@RequestParam(value="confirmPassword") String confirmPassword,HttpServletRequest request) {
        //判断输入框是否为空
        if (userNumber == null || "".equals(userNumber)) {
            return Response.error("账号不能为空！");
        }
        if (password == null || "".equals(password)) {
            return Response.error("账号不能为空！");
        }
        if (newPassword == null || "".equals(newPassword)) {
            return Response.error("账号不能为空！");
        }
        if (confirmPassword == null || "".equals(confirmPassword)) {
            return Response.error("账号不能为空！");
        }
        //判断密码和确认密码是否一致
        if (!newPassword.equals(confirmPassword)) {
            return Response.error("两次密码不一致！");
        }
        // 通过调用工具类方法获取员工对象
        User user = UserUtil.getUserByRequest(request);
        //比较账号以及密码是否一致
        if((userNumber.equals(user.getUserNumber()))&&(MD5.stringMD5(password).equals(user.getPassword()))){
            //修改密码
            boolean flag = userService.modifyPassword(userNumber,MD5.stringMD5(newPassword));
            if(flag == true){
                //获取当前登录的令牌
                String tokenLogin = request.getHeader("tokenLogin");
                Jedis jedis = jedisPool.getResource();
                //删除该令牌
                jedis.del(tokenLogin);
                return Response.success("登录后 ----- 修改密码成功！",null);
            }
            else{
                return Response.error("500","修改密码失败！请稍后重试");
            }
        }
        else{
            return Response.error("您输入的原密码有误，请重新确认");
        }
    }


}
